import { assertEquals } from "asserts";

import { default as plusOne } from "./index.ts";

Deno.test({
    name: `
  Input: [0]
  Output: [1]
  Explanation: The array represents the integer 0.
  `,
    fn(): void {
        const result = plusOne([0]);
        assertEquals(result, [1]);
    },
});

Deno.test({
    name: `
  Input: [1,2,3]
  Output: [1,2,4]
  Explanation: The array represents the integer 123.
  `,
    fn(): void {
        const result = plusOne([1, 2, 3]);
        assertEquals(result, [1, 2, 4]);
    },
});

Deno.test({
    name: `
  Input: [4,3,2,1]
  Output: [4,3,2,2]
  Explanation: The array represents the integer 4321.
  `,
    fn(): void {
        const result = plusOne([4, 3, 2, 1]);
        assertEquals(result, [4, 3, 2, 2]);
    },
});

Deno.test({
    name: `
  Input: [6, 1, 4, 5, 3, 9, 0, 1, 9, 5, 1, 8, 6, 7, 0, 5, 5, 4, 3]
  Output: [6, 1, 4, 5, 3, 9, 0, 1, 9, 5, 1, 8, 6, 7, 0, 5, 5, 4, 4]
  Explanation: The array represents the integer 6145390195186705543.
  `,
    fn(): void {
        const result = plusOne([
            6,
            1,
            4,
            5,
            3,
            9,
            0,
            1,
            9,
            5,
            1,
            8,
            6,
            7,
            0,
            5,
            5,
            4,
            3,
        ]);
        assertEquals(
            result,
            [6, 1, 4, 5, 3, 9, 0, 1, 9, 5, 1, 8, 6, 7, 0, 5, 5, 4, 4],
        );
    },
});

Deno.test({
    name: `
  Input: [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
  Output: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  Explanation: The array represents the integer 99999999999999999999999.
  `,
    fn(): void {
        const result = plusOne([
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
            9,
        ]);
        assertEquals(
            result,
            [
                1,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
            ],
        );
    },
});
Deno.test("plus-one", () => {
    const inputs = [
        [8, 9, 9],
        [9, 9, 9],
        [1, 2, 3],
        [4, 3, 2, 1],
        [9],
        [0],
        [
            2,
            3,
            0,
            1,
            8,
            3,
            0,
            1,
            5,
            4,
            9,
            8,
            1,
            2,
            1,
            9,
            9,
            9,
            8,
            0,
            2,
            1,
            8,
            8,
            2,
            9,
            9,
            1,
            5,
            1,
            8,
            5,
            9,
            1,
        ],
        [3, 4, 9, 4, 8, 9, 7, 3, 5, 5, 9, 8, 5, 3, 6, 4, 4, 8, 5, 7],
        [
            5,
            1,
            9,
            3,
            4,
            5,
            0,
            5,
            5,
            5,
            6,
            6,
            3,
            7,
            0,
            9,
            1,
            7,
            3,
            9,
            1,
            0,
            6,
            0,
            0,
            7,
            7,
            5,
            5,
            4,
            6,
            3,
            9,
            6,
            6,
            4,
            4,
            8,
            5,
            4,
            9,
            2,
            2,
            1,
            6,
            3,
            6,
            2,
            6,
            7,
        ],
        [
            7,
            0,
            0,
            8,
            8,
            2,
            4,
            5,
            0,
            0,
            6,
            2,
            5,
            7,
            1,
            1,
            7,
            8,
            3,
            7,
            6,
            0,
            1,
            7,
            6,
            3,
        ],
        [
            6,
            8,
            9,
            1,
            3,
            4,
            1,
            5,
            0,
            0,
            4,
            1,
            6,
            5,
            3,
            7,
            5,
            5,
            4,
            3,
            7,
            0,
            6,
            0,
            1,
            5,
            6,
            3,
            4,
            5,
            9,
            0,
            3,
            0,
            2,
            9,
            9,
            6,
            8,
            3,
            0,
            5,
            7,
            9,
            4,
            5,
            5,
            9,
            1,
            5,
            0,
            3,
            3,
            8,
            6,
            8,
            8,
            8,
            5,
            8,
            3,
            3,
            9,
            2,
            2,
            4,
            8,
            4,
            6,
            5,
            1,
            3,
            2,
            1,
            5,
            6,
            4,
            4,
            0,
            9,
            2,
            1,
            9,
            5,
            9,
            6,
            4,
            1,
            5,
            4,
            8,
            8,
            2,
            7,
            8,
            7,
            3,
        ],
        [
            1,
            0,
            9,
            1,
            1,
            3,
            1,
            5,
            9,
            2,
            7,
            9,
            6,
            8,
            9,
            9,
            3,
            7,
            2,
            4,
            5,
            6,
            1,
            4,
            4,
            7,
            8,
            9,
            8,
            8,
            5,
            1,
            7,
            8,
            2,
            5,
            5,
            6,
            5,
            6,
            1,
            5,
            1,
            7,
            2,
            8,
            7,
            2,
            3,
            3,
            5,
            0,
            9,
            0,
            7,
            7,
            0,
            0,
            5,
            5,
            4,
            1,
            6,
            4,
            1,
            4,
            5,
            7,
            5,
            9,
            5,
            0,
            4,
            5,
            1,
            7,
            8,
            9,
            4,
            7,
            9,
            4,
            3,
            6,
            8,
            3,
            4,
            4,
            2,
            0,
            8,
        ],
        [
            1,
            0,
            2,
            3,
            1,
            8,
            2,
            9,
            3,
            7,
            3,
            7,
            7,
            0,
            7,
            0,
            6,
            1,
            2,
            8,
            6,
            2,
            5,
            2,
            8,
            6,
            3,
            6,
            6,
            6,
            4,
            0,
            9,
            5,
            1,
            1,
            8,
            3,
            6,
            0,
            2,
            1,
            8,
            0,
            3,
            6,
            2,
            8,
            5,
            9,
            4,
            8,
            2,
            6,
            9,
            9,
            7,
            3,
            6,
            7,
            9,
            8,
            8,
            6,
            1,
            9,
            9,
            4,
            0,
            3,
            4,
            2,
            7,
            2,
            1,
            7,
            2,
            3,
            6,
            6,
            0,
            6,
            3,
            4,
            7,
            4,
            5,
            3,
            8,
        ],
        [
            9,
            2,
            8,
            2,
            8,
            6,
            4,
            3,
            8,
            4,
            8,
            0,
            7,
            9,
            0,
            2,
            6,
            0,
            9,
            7,
            5,
            3,
            4,
            7,
            7,
            6,
            4,
            3,
            6,
            5,
            7,
            3,
            0,
            1,
            9,
            2,
            4,
            5,
            7,
            6,
            1,
            6,
            9,
            3,
            5,
            3,
            5,
            2,
            5,
            9,
            1,
            1,
            5,
            2,
            5,
            1,
            0,
            0,
            9,
            1,
            0,
            3,
            5,
            6,
            3,
            8,
            1,
            9,
            6,
        ],
        [9, 1, 4, 5, 3, 4, 4, 8, 4, 6, 1, 8, 7, 0, 1, 1, 1, 8],
        [
            4,
            6,
            9,
            6,
            9,
            4,
            9,
            3,
            2,
            3,
            0,
            5,
            5,
            6,
            4,
            7,
            3,
            4,
            7,
            0,
            2,
            4,
            0,
            1,
            5,
            4,
            9,
            3,
            6,
            9,
            4,
            6,
            0,
            5,
            8,
            5,
            2,
            8,
            9,
            3,
            1,
            7,
            0,
            7,
            9,
            4,
            9,
            6,
            4,
            0,
            5,
            1,
            5,
            3,
            2,
            6,
            8,
            4,
            8,
            5,
            6,
            8,
            5,
            5,
            5,
            4,
            8,
            5,
            2,
            1,
            2,
            5,
            3,
        ],
        [7, 5, 9, 6, 2, 5, 5, 2, 3, 3, 7, 8, 6, 5, 8, 8, 5],
        [
            5,
            7,
            4,
            4,
            9,
            6,
            4,
            6,
            5,
            7,
            9,
            1,
            0,
            8,
            6,
            9,
            8,
            3,
            5,
            7,
            8,
            5,
            9,
            9,
            0,
            2,
            3,
            5,
            2,
            5,
            3,
            3,
            4,
            3,
            0,
            5,
            6,
            6,
            6,
            3,
            4,
            7,
            4,
            3,
            8,
            3,
            8,
            1,
            7,
            2,
            6,
            3,
            4,
            2,
            2,
            3,
            2,
            6,
            3,
            7,
            9,
            8,
            5,
            1,
            1,
            7,
            8,
            7,
            8,
            5,
            0,
            7,
            6,
            8,
            4,
            7,
            3,
            6,
            2,
            8,
            0,
            7,
            4,
        ],
        [5, 7, 3, 5, 3, 6, 5, 1, 3, 8, 9, 9, 9, 1, 9, 0, 4, 8],
        [
            8,
            9,
            5,
            8,
            5,
            5,
            6,
            9,
            1,
            6,
            4,
            2,
            4,
            8,
            7,
            7,
            9,
            3,
            1,
            6,
            6,
            4,
            2,
            3,
            9,
            6,
            1,
            1,
            8,
            2,
            2,
            4,
            5,
            7,
            0,
            3,
            9,
            0,
            6,
            5,
            1,
            7,
            4,
            1,
            8,
        ],
        [1, 0, 1, 3, 2, 9, 8, 3, 8, 1, 3, 7, 0, 3, 5, 1, 7, 8, 0, 9, 7, 8],
        [
            8,
            7,
            3,
            2,
            8,
            8,
            0,
            3,
            7,
            5,
            3,
            5,
            4,
            3,
            7,
            8,
            3,
            4,
            5,
            0,
            1,
            7,
            1,
            8,
            5,
            0,
            8,
            1,
            2,
            3,
            6,
            1,
            7,
            3,
            3,
            3,
            4,
            1,
            1,
            3,
            0,
            0,
            4,
            8,
            0,
            0,
            9,
            7,
            1,
            0,
            8,
            3,
            4,
            2,
            2,
            2,
            5,
            9,
            4,
            3,
        ],
        [
            8,
            6,
            7,
            0,
            2,
            4,
            6,
            8,
            2,
            2,
            6,
            6,
            5,
            9,
            8,
            3,
            5,
            3,
            8,
            7,
            9,
            7,
            8,
            5,
            6,
            5,
            7,
            1,
            1,
            9,
            4,
            1,
        ],
        [5, 2, 2, 2],
        [9, 8],
    ];
    const outputs = [
        [9, 0, 0],
        [1, 0, 0, 0],
        [1, 2, 4],
        [4, 3, 2, 2],
        [1, 0],
        [1],
        [
            2,
            3,
            0,
            1,
            8,
            3,
            0,
            1,
            5,
            4,
            9,
            8,
            1,
            2,
            1,
            9,
            9,
            9,
            8,
            0,
            2,
            1,
            8,
            8,
            2,
            9,
            9,
            1,
            5,
            1,
            8,
            5,
            9,
            2,
        ],
        [3, 4, 9, 4, 8, 9, 7, 3, 5, 5, 9, 8, 5, 3, 6, 4, 4, 8, 5, 8],
        [
            5,
            1,
            9,
            3,
            4,
            5,
            0,
            5,
            5,
            5,
            6,
            6,
            3,
            7,
            0,
            9,
            1,
            7,
            3,
            9,
            1,
            0,
            6,
            0,
            0,
            7,
            7,
            5,
            5,
            4,
            6,
            3,
            9,
            6,
            6,
            4,
            4,
            8,
            5,
            4,
            9,
            2,
            2,
            1,
            6,
            3,
            6,
            2,
            6,
            8,
        ],
        [
            7,
            0,
            0,
            8,
            8,
            2,
            4,
            5,
            0,
            0,
            6,
            2,
            5,
            7,
            1,
            1,
            7,
            8,
            3,
            7,
            6,
            0,
            1,
            7,
            6,
            4,
        ],
        [
            6,
            8,
            9,
            1,
            3,
            4,
            1,
            5,
            0,
            0,
            4,
            1,
            6,
            5,
            3,
            7,
            5,
            5,
            4,
            3,
            7,
            0,
            6,
            0,
            1,
            5,
            6,
            3,
            4,
            5,
            9,
            0,
            3,
            0,
            2,
            9,
            9,
            6,
            8,
            3,
            0,
            5,
            7,
            9,
            4,
            5,
            5,
            9,
            1,
            5,
            0,
            3,
            3,
            8,
            6,
            8,
            8,
            8,
            5,
            8,
            3,
            3,
            9,
            2,
            2,
            4,
            8,
            4,
            6,
            5,
            1,
            3,
            2,
            1,
            5,
            6,
            4,
            4,
            0,
            9,
            2,
            1,
            9,
            5,
            9,
            6,
            4,
            1,
            5,
            4,
            8,
            8,
            2,
            7,
            8,
            7,
            4,
        ],
        [
            1,
            0,
            9,
            1,
            1,
            3,
            1,
            5,
            9,
            2,
            7,
            9,
            6,
            8,
            9,
            9,
            3,
            7,
            2,
            4,
            5,
            6,
            1,
            4,
            4,
            7,
            8,
            9,
            8,
            8,
            5,
            1,
            7,
            8,
            2,
            5,
            5,
            6,
            5,
            6,
            1,
            5,
            1,
            7,
            2,
            8,
            7,
            2,
            3,
            3,
            5,
            0,
            9,
            0,
            7,
            7,
            0,
            0,
            5,
            5,
            4,
            1,
            6,
            4,
            1,
            4,
            5,
            7,
            5,
            9,
            5,
            0,
            4,
            5,
            1,
            7,
            8,
            9,
            4,
            7,
            9,
            4,
            3,
            6,
            8,
            3,
            4,
            4,
            2,
            0,
            9,
        ],
        [
            1,
            0,
            2,
            3,
            1,
            8,
            2,
            9,
            3,
            7,
            3,
            7,
            7,
            0,
            7,
            0,
            6,
            1,
            2,
            8,
            6,
            2,
            5,
            2,
            8,
            6,
            3,
            6,
            6,
            6,
            4,
            0,
            9,
            5,
            1,
            1,
            8,
            3,
            6,
            0,
            2,
            1,
            8,
            0,
            3,
            6,
            2,
            8,
            5,
            9,
            4,
            8,
            2,
            6,
            9,
            9,
            7,
            3,
            6,
            7,
            9,
            8,
            8,
            6,
            1,
            9,
            9,
            4,
            0,
            3,
            4,
            2,
            7,
            2,
            1,
            7,
            2,
            3,
            6,
            6,
            0,
            6,
            3,
            4,
            7,
            4,
            5,
            3,
            9,
        ],
        [
            9,
            2,
            8,
            2,
            8,
            6,
            4,
            3,
            8,
            4,
            8,
            0,
            7,
            9,
            0,
            2,
            6,
            0,
            9,
            7,
            5,
            3,
            4,
            7,
            7,
            6,
            4,
            3,
            6,
            5,
            7,
            3,
            0,
            1,
            9,
            2,
            4,
            5,
            7,
            6,
            1,
            6,
            9,
            3,
            5,
            3,
            5,
            2,
            5,
            9,
            1,
            1,
            5,
            2,
            5,
            1,
            0,
            0,
            9,
            1,
            0,
            3,
            5,
            6,
            3,
            8,
            1,
            9,
            7,
        ],
        [9, 1, 4, 5, 3, 4, 4, 8, 4, 6, 1, 8, 7, 0, 1, 1, 1, 9],
        [
            4,
            6,
            9,
            6,
            9,
            4,
            9,
            3,
            2,
            3,
            0,
            5,
            5,
            6,
            4,
            7,
            3,
            4,
            7,
            0,
            2,
            4,
            0,
            1,
            5,
            4,
            9,
            3,
            6,
            9,
            4,
            6,
            0,
            5,
            8,
            5,
            2,
            8,
            9,
            3,
            1,
            7,
            0,
            7,
            9,
            4,
            9,
            6,
            4,
            0,
            5,
            1,
            5,
            3,
            2,
            6,
            8,
            4,
            8,
            5,
            6,
            8,
            5,
            5,
            5,
            4,
            8,
            5,
            2,
            1,
            2,
            5,
            4,
        ],
        [7, 5, 9, 6, 2, 5, 5, 2, 3, 3, 7, 8, 6, 5, 8, 8, 6],
        [
            5,
            7,
            4,
            4,
            9,
            6,
            4,
            6,
            5,
            7,
            9,
            1,
            0,
            8,
            6,
            9,
            8,
            3,
            5,
            7,
            8,
            5,
            9,
            9,
            0,
            2,
            3,
            5,
            2,
            5,
            3,
            3,
            4,
            3,
            0,
            5,
            6,
            6,
            6,
            3,
            4,
            7,
            4,
            3,
            8,
            3,
            8,
            1,
            7,
            2,
            6,
            3,
            4,
            2,
            2,
            3,
            2,
            6,
            3,
            7,
            9,
            8,
            5,
            1,
            1,
            7,
            8,
            7,
            8,
            5,
            0,
            7,
            6,
            8,
            4,
            7,
            3,
            6,
            2,
            8,
            0,
            7,
            5,
        ],
        [5, 7, 3, 5, 3, 6, 5, 1, 3, 8, 9, 9, 9, 1, 9, 0, 4, 9],
        [
            8,
            9,
            5,
            8,
            5,
            5,
            6,
            9,
            1,
            6,
            4,
            2,
            4,
            8,
            7,
            7,
            9,
            3,
            1,
            6,
            6,
            4,
            2,
            3,
            9,
            6,
            1,
            1,
            8,
            2,
            2,
            4,
            5,
            7,
            0,
            3,
            9,
            0,
            6,
            5,
            1,
            7,
            4,
            1,
            9,
        ],
        [1, 0, 1, 3, 2, 9, 8, 3, 8, 1, 3, 7, 0, 3, 5, 1, 7, 8, 0, 9, 7, 9],
        [
            8,
            7,
            3,
            2,
            8,
            8,
            0,
            3,
            7,
            5,
            3,
            5,
            4,
            3,
            7,
            8,
            3,
            4,
            5,
            0,
            1,
            7,
            1,
            8,
            5,
            0,
            8,
            1,
            2,
            3,
            6,
            1,
            7,
            3,
            3,
            3,
            4,
            1,
            1,
            3,
            0,
            0,
            4,
            8,
            0,
            0,
            9,
            7,
            1,
            0,
            8,
            3,
            4,
            2,
            2,
            2,
            5,
            9,
            4,
            4,
        ],
        [
            8,
            6,
            7,
            0,
            2,
            4,
            6,
            8,
            2,
            2,
            6,
            6,
            5,
            9,
            8,
            3,
            5,
            3,
            8,
            7,
            9,
            7,
            8,
            5,
            6,
            5,
            7,
            1,
            1,
            9,
            4,
            2,
        ],
        [5, 2, 2, 3],
        [9, 9],
    ];
    assertEquals(inputs.map(plusOne), outputs);
});
